/*
 * @Author: ljk
 * @Date: 2023-05-19 12:50:08
 * @LastEditors: ljk
 * @LastEditTime: 2023-05-20 14:06:44
 * @Description: 信号的保存
 */
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <assert.h>
#include <cstring>

using namespace std;

static void PrintPending(sigset_t &pending)
{
    cout << "The process pending bitmap: ";
    for (int signo = 1; signo <= 31; signo++)
    {
        if (sigismember(&pending, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}
static void handler(int signo)
{
    cout << "handle the SIGINT signal: " << signo << endl;
    int cnt = 30;
    while (cnt)
    {
        cnt--;
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);
        PrintPending(pending);
        sleep(1);
    }
}
int main()
{
    cout << "pid: " << getpid() << ", start process..." << endl;
    struct sigaction act, oldact;
    memset(&act, 0, sizeof(act));
    memset(&oldact, 0, sizeof(oldact));
    act.sa_handler = handler;
    act.sa_flags = 0;
    //正在处理的对2号信号是屏蔽的
    sigemptyset(&act.sa_mask);

    // 在处理2号信号的同时屏蔽3 4 5号信号
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);


    sigaction(2, &act, &oldact);

    

    while (true)
    {
        sleep(1);
    }
    
    // // 1. 屏蔽2号信号
    // sigset_t set, oset;

    // // 1.0 设置对2号信号特定捕捉动作
    // int cnt = 0;
    // signal(SIGINT, handler);

    // // 1.1 初始化
    // sigemptyset(&set);
    // sigemptyset(&oset);
    // // 1.2 将2号信号添加到set中
    // sigaddset(&set, SIGINT);
    // // 有些特定信号是不能被自定义的
    // // sigaddset(&set, SIGQUIT);
    // // sigaddset(&set, SIGKILL);

    // // 1.3 将新的信号屏蔽字设置进程
    // sigprocmask(SIG_BLOCK, &set, &oset);

    // cout << "pid: " << getpid() << endl;

    // // 2. 循环获取进程的pending信号1集合 并01打印
    // while (true)
    // {
    //     // 2.1 先获取pending信号集
    //     sigset_t pending;
    //     sigemptyset(&pending);
    //     int n = sigpending(&pending);
    //     assert(n == 0);
    //     (void)n;

    //     // 2.2 打印观察信号集
    //     PrintPending(pending);

    //     // 2.3 休眠
    //     sleep(1);

    //     // 2.4 一段时间后恢复对所有信号的block动作
    //     if (cnt++ == 10)
    //     {
    //         cout << "recover all signal block handler" << endl;
    //         sigprocmask(SIG_SETMASK, &oset, nullptr);
    //     }
    // }
    return 0;
}